import fs from 'fs';
import path from 'path';

/**
 * 将 css 文件中的 oklch颜色定义 转换为 rgb
 * @param file 文件路径
 */
export default function rgb(file: string) {
  // 检查文件是否存在
  if (!fs.existsSync(file)) {
    console.error(`文件不存在: ${file}`);
    return;
  }

  // 读取文件内容
  const content = fs.readFileSync(file, 'utf-8');
  
  // 匹配 oklch() 颜色值的正则表达式
  // 匹配格式: oklch(L C H) 或 oklch(L C H / A)
  const oklchRegex = /oklch\(\s*([\d.]+%?)\s+([\d.]+)\s+([\d.]+(?:deg)?)\s*(?:\/\s*([\d.]+%?))?\s*\)/gi;
  
  // 替换所有 OKLCH 颜色为 RGB
  const newContent = content.replace(oklchRegex, (match, l, c, h, a) => {
    const rgb = oklchToRgb(parseFloat(l), parseFloat(c), parseFloat(h));
    
    if (a !== undefined) {
      // 如果有透明度，使用 rgba
      const alpha = a.includes('%') ? parseFloat(a) / 100 : parseFloat(a);
      return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
    } else {
      // 否则使用 rgb
      return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;
    }
  });

  // 如果内容有变化，写回文件
  if (newContent !== content) {
    fs.writeFileSync(file, newContent, 'utf-8');
    console.log(`已转换文件: ${file}`);
  } else {
    console.log(`文件中没有找到 OKLCH 颜色: ${file}`);
  }
}

/**
 * 将 OKLCH 颜色转换为 RGB
 * @param l 亮度 (0-1 或 0-100%)
 * @param c 色度 (0-0.4)
 * @param h 色相 (0-360度)
 * @returns RGB 颜色对象
 */
function oklchToRgb(l: number, c: number, h: number): { r: number; g: number; b: number } {
  // 处理亮度值，如果是百分比则转换
  const lightness = l > 1 ? l / 100 : l;
  
  // 将色相转换为弧度
  const hueRad = (h % 360) * Math.PI / 180;
  
  // OKLCH 到 OKLAB 转换
  const a = c * Math.cos(hueRad);
  const bComponent = c * Math.sin(hueRad);
  
  // OKLAB 到 Linear RGB 转换
  const l_ = lightness + 0.3963377774 * a + 0.2158037573 * bComponent;
  const m_ = lightness - 0.1055613458 * a - 0.0638541728 * bComponent;
  const s_ = lightness - 0.0894841775 * a - 1.2914855480 * bComponent;

  const l3 = l_ * l_ * l_;
  const m3 = m_ * m_ * m_;
  const s3 = s_ * s_ * s_;

  // Linear RGB
  const linearR = +4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3;
  const linearG = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3;
  const linearB = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.7076147010 * s3;

  // 线性 RGB 到 sRGB 转换（gamma 校正）
  const toSrgb = (c: number): number => {
    if (c <= 0.0031308) {
      return 12.92 * c;
    } else {
      return 1.055 * Math.pow(c, 1.0 / 2.4) - 0.055;
    }
  };

  const r = Math.round(Math.max(0, Math.min(255, toSrgb(linearR) * 255)));
  const g = Math.round(Math.max(0, Math.min(255, toSrgb(linearG) * 255)));
  const b = Math.round(Math.max(0, Math.min(255, toSrgb(linearB) * 255)));

  return { r, g, b };
}